package model;

import java.math.BigDecimal;
import java.text.NumberFormat;
import java.util.Calendar;
import java.util.Vector;
import data.AdmPersistDepartamento;
import data.AdmPersistDetalleDeuda;
import data.AdmPersistLiquidacionExpensas;
import data.AdmPersistPresupuesto;
import data.AdmPersistReciboPagoExpensas;
import data.AdmPersistReclamo;

public class Consorcio {

	private int numero;
	private String nombre;
	private String direccion;
	private String cuit;
	private float fondo;
	private Vector<Departamento> departamentos;
	private Vector<Presupuesto> presupuestos;
	private Vector<Reclamo> reclamos;
	private Vector<DetalleDeuda> detallesDeuda;
	private Vector<ReciboPagoExpensas> recibosPagoExpensas;
	private Vector<LiquidacionExpensas> liquidaciones;
	
	
public Consorcio(int numero, String nombre, String direccion, String cuit,float fondo){
	this.numero=numero;
	this.nombre=nombre;
	this.direccion=direccion;
	this.cuit=cuit;
	this.fondo=fondo;
	departamentos=new Vector<Departamento>();
	presupuestos=new Vector<Presupuesto>();
	reclamos=new Vector<Reclamo>();
	detallesDeuda=new Vector<DetalleDeuda>();
	recibosPagoExpensas=new Vector<ReciboPagoExpensas>();
	liquidaciones=new Vector<LiquidacionExpensas>();
}

public void registrarReclamo(Calendar fecha, int unidadFuncional, String descripcion, String urgencia)
{
	Departamento departamento=this.buscarDepartamento(unidadFuncional);
	int nroReclamo = AdmPersistReclamo.getInstancia().getMaxNroReclamo() + 1;
	Reclamo reclamo=new Reclamo(nroReclamo,fecha,departamento,descripcion,urgencia);
	reclamo.persistir(this);
	this.reclamos.add(reclamo);
}
	
public void altaDepartamento(Propietario propietario, float porcentaje, int unidadFuncional, int piso, String letra, int cocheras){
	Departamento d=new Departamento(unidadFuncional, porcentaje, letra, piso, propietario, cocheras);	
	d.persistir();
	this.departamentos.add(d);
}

public void registrarPresupuesto(Calendar fecha, Calendar fechaValidez, Vector<ItemPresupuesto> items, 
								Proveedor proveedor, int nroReclamo, boolean estado){
	
	Reclamo r = this.buscarReclamo(nroReclamo);
	int nroPresupuesto = AdmPersistPresupuesto.getInstancia().getMaxNroPresupuesto() + 1;
	Presupuesto p = new Presupuesto(nroPresupuesto, fecha, fechaValidez, proveedor, r, items, estado);
	p.persistir();
	presupuestos.add(p);
}

public int generarDetalleDeuda(Calendar fecha, BigDecimal interes, int unidadFuncional){
	liquidaciones.addAll(AdmPersistLiquidacionExpensas.getInstancia().selectAll(this.numero));
	Departamento d = this.buscarDepartamento(unidadFuncional);
	Vector<ReciboPagoExpensas> recibos = this.buscarRecibosPagoExpensas(unidadFuncional);
	int numero = AdmPersistDetalleDeuda.getInstancia().getMaxNroDetalleDeuda() + 1;
	DetalleDeuda dd = new DetalleDeuda(numero, fecha, interes, d);	
	dd.generarItemsDetalleDeuda(recibos, liquidaciones);
	if (!dd.getItems().isEmpty()){
		dd.persistir(this);
		detallesDeuda.add(dd);
		return numero;
	}
	else
		return 0;
	
}

public Vector<Vector<String>> obtenerDatosDeuda(int nroDetalleDeuda){
	liquidaciones.addAll(AdmPersistLiquidacionExpensas.getInstancia().selectAll(this.numero));
	DetalleDeuda dd = AdmPersistDetalleDeuda.getInstancia().buscarDetalleDeuda(nroDetalleDeuda);
	Vector<ReciboPagoExpensas> recibos = this.buscarRecibosPagoExpensas(dd.getDepartamento().getUnidadFuncional());
	if(!liquidaciones.isEmpty()){
		return dd.obtenerDatos(recibos, liquidaciones);
	}
	else{
		return null;
	}
}

public Vector<Vector<String>> obtenerDatosReclamo(int unidadFuncional, Calendar desde, Calendar hasta){
	Vector<Reclamo> rr = AdmPersistReclamo.getInstancia().listarReclamos(this.numero, unidadFuncional, desde, hasta);
	Vector<Vector<String>> result = new Vector<Vector<String>>();
	
	if (rr!=null && rr.size()!=0){
	for (int i=0;i<rr.size();i++){
		Vector<String> fila = new Vector<String>(4);
		NumberFormat nf = NumberFormat.getInstance();
		nf.setMaximumFractionDigits(2);
		
		fila.add(String.valueOf(rr.elementAt(i).getNro()));
		fila.add(String.valueOf((rr.elementAt(i).getFecha().get(Calendar.YEAR))+"-"+(rr.elementAt(i).getFecha().get(Calendar.MONTH)+1)+"-"+rr.elementAt(i).getFecha().get(Calendar.DATE)));
		fila.add(rr.elementAt(i).getDepartamento().getPropietario().getApellido()+' '+rr.elementAt(i).getDepartamento().getPropietario().getNombre());
		fila.add(rr.elementAt(i).getDescripcion());
		
		result.add(fila);
	
		}
	}
	return result;
	
}

public String getTotalDetalleDeuda(int nroDetalleDeuda){
	DetalleDeuda dd = AdmPersistDetalleDeuda.getInstancia().buscarDetalleDeuda(nroDetalleDeuda);
	NumberFormat nf = NumberFormat.getInstance();
	nf.setMaximumFractionDigits(2);	
	return nf.format(dd.getTotal());
}

private Reclamo buscarReclamo(int nroReclamo) {
	for (int i=0; i<reclamos.size();i++){
		if (reclamos.elementAt(i).getNro() == nroReclamo)
			return reclamos.elementAt(i);
	}
	return AdmPersistReclamo.getInstancia().buscarReclamoNro(nroReclamo);
}

public Departamento buscarDepartamento(int unidadFuncional){
		for (int i=0; i<departamentos.size();i++){
			if (departamentos.elementAt(i).getUnidadFuncional()==unidadFuncional)
				return departamentos.elementAt(i);
		}
		return AdmPersistDepartamento.getInstancia().buscarDepartamento(unidadFuncional, this.numero);
	
}

private Vector<ReciboPagoExpensas> buscarRecibosPagoExpensas(int unidadFuncional){
	Vector<ReciboPagoExpensas> recibos = new Vector<ReciboPagoExpensas>();
	for (int i=0; i<recibosPagoExpensas.size();i++){
		if (recibosPagoExpensas.elementAt(i).getDepartamento().getUnidadFuncional()==unidadFuncional)
			recibos.add(recibosPagoExpensas.elementAt(i));
	}
	if (recibos.isEmpty())
		return AdmPersistReciboPagoExpensas.getInstancia().buscarRecibosPagoExpensas(this.numero, unidadFuncional);	
	else
		return recibos;
}

public Vector<Departamento> getDepartamentos(){
	return AdmPersistDepartamento.getInstancia().selectAll(this);
}

public String getNombre() {
	return nombre;
}

public int getNumero() {
	return numero;
}



}


